package swimv2gm.bl.domain;

import java.util.Set;

import javax.persistence.*;

/**
 * Il profilo completo di un utente registrato.
 * 
 * @author Matteo Gallesio
 */
@Entity(name = "utenti")
public class User extends Account {

	@Column(nullable = false)
	private String nome;
	@Column(nullable = false)
	private String cognome;
	private String bio;
	private String indirizzo;
	private String telefono;

	@ManyToMany
	private Set<Ability> competenze;

	@OneToMany(mappedBy = "mittente")
	private Set<InternalWorkRequest> sentRequests;

	@OneToMany(mappedBy = "destinatario")
	private Set<WorkRequest> receivedRequests;

	@OneToMany(mappedBy = "mittente")
	private Set<Friendship> sentFriendshipRequests;

	@OneToMany(mappedBy = "destinatario")
	private Set<Friendship> receivedFriendshipRequests;

	/**
	 * Aggiunge una competenza a quelle dichiarate dall'utente.
	 * 
	 * @param c
	 *            la competenza
	 */
	public void addCompetenza(Ability c) {
		competenze.add(c);
	}

	/**
	 * Restituisce l'insieme delle competenze dichiarate da questo utente.
	 * 
	 * @return l'insieme delle competenze
	 */
	public Set<Ability> getCompetenze() {
		return competenze;
	}

	/**
	 * Aggiunge una richiesta di lavoro a quelle inviate dall'utente.
	 * 
	 * @param wr
	 *            la richiesta di lavoro
	 */
	public void addSentRequest(InternalWorkRequest wr) {
		sentRequests.add(wr);
	}

	/**
	 * Restituisce l'insieme delle richieste di lavoro inviate da questo utente.
	 * 
	 * @return l'insieme delle richieste
	 */
	public Set<InternalWorkRequest> getSentRequests() {
		return sentRequests;
	}

	/**
	 * Aggiunge una richiesta di lavoro a quelle ricevute dall'utente.
	 * 
	 * @param wr
	 *            la richiesta di lavoro
	 */
	public void addReceivedRequest(WorkRequest wr) {
		receivedRequests.add(wr);
	}

	/**
	 * Restituisce l'insieme delle richieste di lavoro ricevute da questo utente.
	 * 
	 * @return l'insieme delle richieste
	 */
	public Set<WorkRequest> getReceivedRequests() {
		return receivedRequests;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCognome() {
		return cognome;
	}

	public void setCognome(String cognome) {
		this.cognome = cognome;
	}

	public String getBio() {
		return bio;
	}

	public void setBio(String bio) {
		this.bio = bio;
	}

	public String getIndirizzo() {
		return indirizzo;
	}

	public void setIndirizzo(String indirizzo) {
		this.indirizzo = indirizzo;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public Set<Friendship> getSentFriendshipRequests() {
		return sentFriendshipRequests;
	}

	public void addSentFriendshipRequest(Friendship f) {
		sentFriendshipRequests.add(f);
	}

	public Set<Friendship> getReceivedFriendshipRequests() {
		return receivedFriendshipRequests;
	}

	public void addReceivedFriendshipRequest(Friendship f) {
		receivedFriendshipRequests.add(f);
	}
}
